package com.dareway.offline.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

@RestController
public class ForwardController {

    // 注入目标服务器地址（从配置文件读取）
    @Value("${target.server.url}")
    private String targetServerUrl;

    // 注入RestTemplate（用于发送请求）
    private final RestTemplate restTemplate;

    // 构造函数注入（推荐方式）
    public ForwardController(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    /**
     * 转发所有请求（支持GET/POST/PUT/DELETE等所有HTTP方法）
     * 路径匹配：本地服务的所有路径（/api/**）都会被转发
     */
    @RequestMapping(value = "/api/**", method = {RequestMethod.GET, RequestMethod.POST,
            RequestMethod.PUT, RequestMethod.DELETE, RequestMethod.PATCH})
    public ResponseEntity<String> forwardRequest(
            HttpServletRequest request,
            @RequestBody(required = false) String requestBody) {

        try {
            // 1. 获取原始请求URI（例如：/api/getOrgInfo）
            String originalUri = request.getRequestURI();

            // 2. 清除 /api 前缀（关键步骤）：将 /api/xxx 转换为 /xxx
            // 注意：使用 replaceFirst 仅替换开头的 /api，避免匹配中间的字符串
            String cleanedUri = originalUri.replaceFirst("^/api", "");
            // 特殊情况处理：如果原始URI是 /api，替换后会变成空字符串，需补全为 /
            if (cleanedUri.isEmpty()) {
                cleanedUri = "/";
            }

            // 3. 构建目标服务器完整URL（目标地址 + 清除前缀后的路径 + 查询参数）
            String targetUrl = targetServerUrl + cleanedUri;
            String queryString = request.getQueryString();
            if (queryString != null && !queryString.isEmpty()) {
                targetUrl += "?" + queryString;
            }

            // 4. 复制原始请求的Headers（如Cookie、Authorization等）
            HttpHeaders headers = new HttpHeaders();
            Enumeration<String> headerNames = request.getHeaderNames();
            while (headerNames.hasMoreElements()) {
                String headerName = headerNames.nextElement();
                headers.add(headerName, request.getHeader(headerName));
            }

            // 5. 创建转发请求实体（包含Headers和Body）
            HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers);

            // 6. 转发请求到目标服务器（根据原始请求方法动态转发）
            HttpMethod httpMethod = HttpMethod.valueOf(request.getMethod());
            ResponseEntity<String> response = restTemplate.exchange(
                    targetUrl,
                    httpMethod,
                    requestEntity,
                    String.class  // 响应体类型（此处为字符串，兼容JSON/XML等）
            );

            // 7. 将目标服务器的响应原样返回给前端
            return response;

        } catch (Exception e) {
            // 处理转发失败（如目标服务器不可达）
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body("转发失败：" + e.getMessage());
        }
    }
}